﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Text.RegularExpressions;
using tea.DB;
using tea.BL;
using tea.Models;
using Util;
using System.Diagnostics;

namespace tea.Controllers
{
    [Authorize]
    public class BbsController : Controller
    {

        [HttpGet]
        public ActionResult List(PaginationModel pagination)
        {
            string 키 = "BbsList" + pagination.ID;
            ViewState.Load(키, pagination, PaginationModel.DEFAULT);

            using (var db = new DBDataContext()) {
                var list = db.게시글.Where(p => p.게시판ID == pagination.ID);
                
                // 게시글 분류
                if (pagination.category != BL게시판.게시글분류_전체) list = list.Where(p => p.게시글분류ID == pagination.category);

                // 검색
                if (  pagination.srchType == BL게시판.검색_없음 || 
                     (Request.Url.Query.IndexOf("srchText") > 0 && string.IsNullOrWhiteSpace(Request.QueryString["srchText"]))) 
                {
                    pagination.srchType = BL게시판.검색_없음;
                    pagination.srchText = null;
                } else {
                    switch (pagination.srchType)
                    {
                        case BL게시판.검색_제목: list = list.Where(p => p.제목.Contains(pagination.srchText)); break;
                        case BL게시판.검색_제목내용: list = list.Where(p => p.제목.Contains(pagination.srchText) || p.내용.Contains(pagination.srchText)); break;
                        case BL게시판.검색_작성자: list = list.Where(p => p.사용자.이름 == pagination.srchText); break;
                        default: Debug.Assert(false); break;
                    }
                }

                // 현재 페이지
                pagination.pageCount = (int)Math.Ceiling((double)list.Count() / (double)pagination.size);
                pagination.page = Math.Max(1, Math.Min(pagination.page.Value, pagination.pageCount.Value));
                pagination.url = Url.BbsList(new PaginationModel { ID = pagination.ID, page = 989898 }).Replace("989898", "{0}");

                var 모델 = new BbsListModel {
                    pagination = pagination,
                    게시판 = db.게시판.Single(p => p.ID == pagination.ID),
                    게시글목록 = list.OrderByDescending(p => p.ID)
                                     .Skip((pagination.page.Value - 1) * pagination.size.Value)
                                     .Take(pagination.size.Value)
                                     .Select(p => new 게시글Model(p, false)).ToList(),
                    게시글분류목록 = new SelectList(BL게시판.게시글분류목록(pagination.ID.Value, 전체항목_포함: true), "ID", "제목")
                };
                ViewState.Save(키, pagination);
                return View(모델);
            }
        }

        [HttpGet]
        public ActionResult Article(long id)
        {
            using (var db = new DBDataContext()) {
                var 글 = db.게시글.Single(p => p.ID == id);
                var 모델 = new BbsArticleModel {
                    게시글 = new 게시글Model(글, true),
                    게시판 = 글.게시판,
                    수정권한 = BL게시판.글수정권한(글),
                    덧글모델 = new CommentMainModel { 대상구분 = Consts.덧글대상_게시글, 대상ID = 글.ID }
                };
                return View(모델);
            }
        }

        [HttpGet]
        public ActionResult New(int id)
        {
            var 게시글분류목록 = BL게시판.게시글분류목록(id);
            return View("Edit", new BbsEditModel { 
                게시글 = new 게시글Model { 게시판ID = id, 게시글분류ID = 게시글분류목록[0].ID },
                게시글분류목록 = 게시글분류목록 
            });
        }

        [HttpGet]
        public ActionResult Edit(long id)
        {
            using (var db = new DBDataContext()) {
                var 글 = db.게시글.Single(p => p.ID == id);
                var 모델 = new BbsEditModel {
                    게시글 = new 게시글Model(글, true),
                    게시글분류목록 = BL게시판.게시글분류목록(글.게시판ID)
                };
                return View(모델);
            }
        }

        [HttpPost]
        [ValidateInput(false)]
        public ActionResult Save(BbsEditModel 모델) // referenced by Edit.cshtml
        {
            string url = "";
            if (String.IsNullOrEmpty(모델.게시글.제목)) return Json(Consts.Ajax제목오류);
            if (String.IsNullOrEmpty(모델.게시글.내용)) return Json(Consts.Ajax내용오류);
            using (var db = new DBDataContext()) {
                if (모델.게시글.ID == 0) {
                    var 새글 = new DB.게시글();
                    게시글Model.Copy(from: 모델.게시글, to: 새글, 내용포함: true );
                    var list = db.게시글.Where(p => p.게시판ID == 모델.게시글.게시판ID);
                    새글.번호 = (list.Count() > 0) ? list.Max(p => p.번호) + 1 : 1;
                    새글.작성자ID = BL사용자.현재사용자.ID;
                    새글.수정일 = DateTime.Now;
                    db.게시글.InsertOnSubmit(새글);
                    db.SubmitChanges();
                    새글.부모글ID = 새글.ID; // TODO: 답글 쓰기 기능 구현

                    BL파일.이미지첨부정보_저장(db, 새글.내용, 새글.ID, BL파일.파일첨부_게시글이미지파일);
                    db.SubmitChanges();
                    url = Url.BbsListInit(모델.게시글.게시판ID);
                } else {
                    var 글1 = db.게시글.Single(p => p.ID == 모델.게시글.ID);
                    if (BL게시판.글수정권한(글1) == false) return Json(Consts.Ajax권한없음);

                    글1.제목 = 모델.게시글.제목;
                    글1.내용 = 모델.게시글.내용;
                    글1.게시글분류ID = 모델.게시글.게시글분류ID;
                    글1.수정일 = DateTime.Now;

                    BL파일.이미지첨부정보_저장(db, 글1.내용, 글1.ID, BL파일.파일첨부_게시글이미지파일);
                    db.SubmitChanges();
                    url = Url.BbsArticle(모델.게시글.ID);
                }
                BL파일.불필요한파일삭제();
                return Json(new AjaxSuccessModel(url)); 
            }
        }

        [HttpPost] 
        [Util.AjaxOnly]
        public ActionResult Delete(long id)
        {
            using (var db = new DBDataContext()) {
                var 글 = db.게시글.Single(p => p.ID == id);
                if (BL게시판.글수정권한(글) == false) return Json(Consts.Ajax권한없음);

                int 게시판ID = 글.게시판ID;
                db.덧글.DeleteAllOnSubmit(db.덧글.Where(p => p.대상구분 == Consts.덧글대상_게시글 && p.대상ID == id));
                db.파일첨부.DeleteAllOnSubmit(db.파일첨부.Where(p => p.대상ID == id && (p.대상유형 == BL파일.파일첨부_게시글이미지파일 || p.대상유형 == BL파일.파일첨부_게시글첨부파일)));
                db.게시글.DeleteOnSubmit(글);
                db.SubmitChanges();
                BL파일.불필요한파일삭제();
                return Json(new AjaxSuccessModel(Url.BbsList(게시판ID)));
            }
        }

    }
}
